/*
 * To change this template, choose Tools | Templates
 * and open the template in the editor.
 */
package beans;

import Utilidades.ExibirMensagens;
import Utilidades.VariaveisEstaticas;
import dominio.Cliente;
import dominio.Endereco;
import java.text.ParseException;
import java.util.ArrayList;
import java.util.List;
import javax.faces.bean.ManagedBean;

import javax.faces.bean.SessionScoped;

import negocio.ManterClienteNegocio;
import negocio.ManterEnderecoNegocio;

/**
 *
 * @author Isaac Danilo
 * Classe usada para receber e fazer requisições com o servidor.
 */
@ManagedBean
@SessionScoped
public class ManterClienteBean {

    private ManterClienteNegocio manterClienteNegocio;
    private Cliente cliente;
    private List<Cliente> clientes;
    private boolean exibeTabela;
    private boolean naoSelecionouCliente = true;
    private Endereco endereco;
    private String cpfCnpj;
    private String telefone;
    private String celular;
    private ManterEnderecoNegocio manterEnderecoNegocio;

    public ManterClienteBean() {
        inicializarAtributos();
    }

    private void inicializarAtributos(){
        manterClienteNegocio = new ManterClienteNegocio();
        cliente = new Cliente();
        clientes = new ArrayList<Cliente>();
        exibeTabela = false;
        cpfCnpj = "";
        telefone = "";
        celular = "";
        endereco = new Endereco();
        manterEnderecoNegocio = new ManterEnderecoNegocio();
    }

    /**
     * Método que irá chamar o método create() da classe ManterClienteNegócio.
     *
     */
    public void create() throws ParseException {
        //DateFormat geraData = new SimpleDateFormat();
        //String data2 = (String)data;
        //Date auxData = geraData.parse(data2);
        int resEndereco = manterEnderecoNegocio.create(endereco);
        if (resEndereco == VariaveisEstaticas.SUCESSO) {
            cliente.setEndereco(endereco);

            /** Variável usada para receber o retorno do método create() da classe manterFuncionarioNegocio.<br>
             * Esse retorno é usado para saber se o funcionario foi armazenado ou não, distinguindo assim os possíveis erros.
             */
            int res = manterClienteNegocio.create(cliente);
            /** switch usado para mostrar a mensagem de inserção ao usário de acordo com o valor da
             * variável res.
             */
            exibeTabela = false;
            switch (res) {
                case VariaveisEstaticas.SUCESSO:
                    ExibirMensagens.exibirMensagens(VariaveisEstaticas.INFORMATIVA, "SUCESSO", new Integer[]{new Integer(4), new Integer(0)});
                    inicializarAtributos();
                    break;
                case VariaveisEstaticas.ERRO_DUPLICACAO:
                    ExibirMensagens.exibirMensagens(VariaveisEstaticas.ERRO, "ERRO2", new Integer[]{new Integer(3), new Integer(4), new Integer(0)});
                    break;
                case VariaveisEstaticas.ERRO_BD:
                    ExibirMensagens.exibirMensagens(VariaveisEstaticas.ERRO, "ERRO2", new Integer[]{new Integer(6), new Integer(5), new Integer(1)});
                    break;
            }
        } else {
            ExibirMensagens.exibirMensagens(VariaveisEstaticas.ERRO, "ERRO2", new Integer[]{new Integer(6), new Integer(5), new Integer(1)});
        }
    }

    /**
     * Método que irá chamar o edit da classe manterFuncionarioNegocio. É usado para editar um funcionario.
     *
     */
    public void edit() throws ParseException {

        Endereco endOld = new Endereco();
        endOld = manterClienteNegocio.findCliente(cliente).getEndereco();
        int resEndereco = manterEnderecoNegocio.edit(endereco);

        if (resEndereco == VariaveisEstaticas.SUCESSO) {

            cliente.setEndereco(endereco);

            int res = manterClienteNegocio.edit(cliente);
            exibeTabela = false;
            switch (res) {
                case VariaveisEstaticas.SUCESSO:
                    ExibirMensagens.exibirMensagens(VariaveisEstaticas.INFORMATIVA, "SUCESSO", new Integer[]{new Integer(4), new Integer(1)});

                    naoSelecionouCliente = true;   // Caso ele consiga excluir o funcionario, então essa variável irá receber true para desabilitar o botão.
                    //produto = new Produto();
                    inicializarAtributos();
                    break;

                case VariaveisEstaticas.ERRO_DUPLICACAO:
                    ExibirMensagens.exibirMensagens(VariaveisEstaticas.ERRO, "ERRO2", new Integer[]{new Integer(3), new Integer(4), new Integer(0)});
                    break;
                case VariaveisEstaticas.ERRO_BD:
                    ExibirMensagens.exibirMensagens(VariaveisEstaticas.ERRO, "ERRO2", new Integer[]{new Integer(6), new Integer(5), new Integer(1)});
                    break;
            }
        } else {
            ExibirMensagens.exibirMensagens(VariaveisEstaticas.ERRO, "ERRO2", new Integer[]{new Integer(6), new Integer(5), new Integer(1)});
        }
    }

    /**
     * Método que irá chamar o destroy() da classe manterFuncionarioNegocio, será chamado para excluir um funcionario.
     *
     */
    public void destroy() {
        int resEndereco = manterEnderecoNegocio.destroy(endereco);
        if (resEndereco == VariaveisEstaticas.SUCESSO) {
            int res = manterClienteNegocio.destroy(cliente);
            exibeTabela = false;
            switch (res) {
                case VariaveisEstaticas.SUCESSO:
                    ExibirMensagens.exibirMensagens(VariaveisEstaticas.INFORMATIVA, "SUCESSO", new Integer[]{new Integer(4), new Integer(2)});

                    naoSelecionouCliente = true;   // Caso ele consiga excluir o funcionario, então essa variável irá receber true para desabilitar o botão.
                    inicializarAtributos();
                    break;
                case VariaveisEstaticas.ERRO_BD:
                    ExibirMensagens.exibirMensagens(VariaveisEstaticas.ERRO, "ERRO2", new Integer[]{new Integer(6), new Integer(5), new Integer(1)});
                    break;
            }
        } else {
            ExibirMensagens.exibirMensagens(VariaveisEstaticas.ERRO, "ERRO2", new Integer[]{new Integer(6), new Integer(5), new Integer(1)});
        }
    }

    public void findClienteEntities() {
        exibeTabela = true;

        clientes = manterClienteNegocio.findClienteEntities();

    }

    public String getCelular() {
        return celular;
    }

    public void setCelular(String celular) {
        this.celular = celular;
    }

    public Cliente getCliente() {
        return cliente;
    }

    public void setCliente(Cliente cliente) {
        this.cliente = cliente;
    }

    public List<Cliente> getClientes() {
        return clientes;
    }

    public void setClientes(List<Cliente> clientes) {
        this.clientes = clientes;
    }

    public String getCpfCnpj() {
        return cpfCnpj;
    }

    public void setCpfCnpj(String cpfCnpj) {
        this.cpfCnpj = cpfCnpj;
    }

    public Endereco getEndereco() {
        return endereco;
    }

    public void setEndereco(Endereco endereco) {
        this.endereco = endereco;
    }

    public boolean isExibeTabela() {
        return exibeTabela;
    }

    public void setExibeTabela(boolean exibeTabela) {
        this.exibeTabela = exibeTabela;
    }

    public ManterClienteNegocio getManterClienteNegocio() {
        return manterClienteNegocio;
    }

    public void setManterClienteNegocio(ManterClienteNegocio manterClienteNegocio) {
        this.manterClienteNegocio = manterClienteNegocio;
    }

    public ManterEnderecoNegocio getManterEnderecoNegocio() {
        return manterEnderecoNegocio;
    }

    public void setManterEnderecoNegocio(ManterEnderecoNegocio manterEnderecoNegocio) {
        this.manterEnderecoNegocio = manterEnderecoNegocio;
    }

    public boolean isNaoSelecionouCliente() {
        return naoSelecionouCliente;
    }

    public void setNaoSelecionouCliente(boolean naoSelecionouCliente) {
        this.naoSelecionouCliente = naoSelecionouCliente;
    }

    public String getTelefone() {
        return telefone;
    }

    public void setTelefone(String telefone) {
        this.telefone = telefone;
    }


}
